#include "opencv.h"
#include "ui_opencv.h"
#include <chrono>

opencv::opencv(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::opencv)
{
    ui->setupUi(this);
    timer1 = new QTimer(this);

    // 提前刷新显式控件
    timeoutSlot1();

    timer1->setInterval(500);   // 设置时间间隔1秒钟
    timer1->setSingleShot(false);    // 为周期循环

    // 连接信号槽要在启动定时器之前连接
    connect(timer1,SIGNAL(timeout()),this,
            SLOT(timeoutSlot1()));

    // 启动定时器
    timer1->start();
//    connect(ui->pushButtonOpen,SIGNAL(clicked()),this,SLOT(onMonitoring())); //点击开启监控，摄像头打开
//    connect(ui->pushButtonClean,SIGNAL(clicked()),this,SLOT(onMonitoring()));//点击关闭监控，摄像头关闭
//    connect(ui->pushButtonKaCha,SIGNAL(clicked()),this,SLOT(onMonitoring()));//点击截图按钮，截取图片并保存

    // 创建 UDP 套接字对象
    udpSocket = new QUdpSocket(this);
    // 创建定时器对象
    timer2 = new QTimer(this);
    // 连接定时器，计时完成，触发槽函数s
    connect(timer2, &QTimer::timeout, this, &opencv::onMonitoring);
    // 连接打开监控按钮到sendRequest 槽函数，当按钮被点击时触发
    connect(ui->pushButtonOpen, SIGNAL(clicked()), this, SLOT(onMonitoring()));
    // 连接关闭监控按钮到sendRequest 槽函数，当按钮被点击时触发
    connect(ui->pushButtonClean, SIGNAL(clicked()), this, SLOT(onMonitoring()));
    // 连接 UDP 套接字的 readyRead 信号到 processDatagrams 槽函数，当有数据可读时触发
    connect(udpSocket, SIGNAL(readyRead()), this, SLOT(processDatagrams()));
    // 连接截图按钮的点击信号到 takeScreenshot 槽函数
    connect(ui->pushButtonKaCha, SIGNAL(clicked()), this, SLOT(onMonitoring()));
    // 连接保存按钮的点击信号到 saveScreenshot 槽函数
    connect(ui->pushButtonsave, SIGNAL(clicked()), this, SLOT(saveScreenshot()));
    ui->label->hide();
    ui->labelKaCha->hide();
}

opencv::~opencv()
{
    // 如果正在运行，则先关闭
    if(timer->isActive())
    {
        timer->stop();
    }

    delete timer;
    delete ui;
}


//监控的控制
void opencv::onMonitoring()
{
    if(sender() == ui->pushButtonOpen)
    {
        //屏蔽开启按钮并修改文字内容
        ui->pushButtonOpen->setEnabled(false);
//        ui->pushButtonOpen->setText("已开启监控");
        //释放关闭按钮
        ui->pushButtonClean->setEnabled(true);

        // 获取按钮文本内容
        request = "open";
        ui->label->show();
    }
    if(sender() == ui->pushButtonClean)
    {
        //释放连接按钮并修改文字内容
        ui->pushButtonOpen->setEnabled(true);
//        ui->pushButtonOpen->setText("开启监控");

        //屏蔽关闭按钮
        ui->pushButtonClean->setEnabled(false);
        request = "close";
        ui->label->hide();//关闭显示
        ui->labelKaCha->hide();//关闭显示

    }
    if(request == "open")
    {
        // 将请求转换为 UTF-8 编码的字节数组
        QByteArray data = request.toUtf8();
        // 向指定的 IP 地址和端口发送数据报
        udpSocket->writeDatagram(data, QHostAddress("192.168.51.214"), 8888);
    }
    if(request == "close")
    {
        // 将请求转换为 UTF-8 编码的字节数组
        QByteArray data = request.toUtf8();
        // 向指定的 IP 地址和端口发送数据报
        udpSocket->writeDatagram(data, QHostAddress("192.168.51.214"), 8888);
    }
    if(sender() == ui->pushButtonKaCha)
    {
        if(request == "open")
        {
            ui->labelKaCha->show();
           // 抓取视频流的内容作为图像
            screenshot = ui->label->grab().toImage();
           // 将抓取到的图像设置为截图预览标签的图像
            ui->labelKaCha->setPixmap(QPixmap::fromImage(screenshot));
        }
        else
        {
            QMessageBox::information(this,"Information","请先打开监控");
            //ui->picture->setText("请先打开监控");
        }
    }
}

//显示时间
void opencv::timeoutSlot1()
{
    // 获取当前系统时间，转换为：时:分:秒
    QString str = QDateTime::currentDateTime().toString("hh:mm:ss");
    ui->lcdNumber->display(str);
}

void opencv::processDatagrams()
{
    // 循环处理所有待处理的数据报
    while (udpSocket->hasPendingDatagrams()) {
        // 创建一个字节数组用于存储接收到的数据
        QByteArray datagram;
        // 设置字节数组的大小为当前待处理数据报的大小
        datagram.resize(udpSocket->pendingDatagramSize());
        // 创建一个地址对象用于存储发送方的地址
        QHostAddress sender;
        // 创建一个无符号短整型变量用于存储发送方的端口号
        quint16 senderPort;
        // 从 UDP 套接字读取数据报，将数据存储到字节数组中，并获取发送方地址和端口号
        udpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
        // 创建QImage对象
        QImage image;
        // 检查QByteArray是否为空
        if (!datagram.isEmpty())
        {
            // 将QByteArray的数据复制到QImage中
            image.loadFromData(datagram);
        }
        else
        {
            qDebug() << "datagram is empty";
        }
        // 检查图像是否加载成功
        if (!image.isNull())
        {
            // 将图像设置为视频标签的像素图，以显示图像
            ui->label->setPixmap(QPixmap::fromImage(image));
        }
        else
        {
            qDebug() << "image is null";
        }
    }
}

void opencv::saveScreenshot()
{
    // 弹出文件对话框让用户选择保存路径
    QString savePath = QFileDialog::getExistingDirectory(this, "选择保存路径");

    // 如果用户选择了有效的保存路径
    if (!savePath.isEmpty())
    {
        // 获取当前时间
        QDateTime currentTime = QDateTime::currentDateTime();
        // 构建保存的文件名，格式为：路径/年-月-日_时-分-秒.png
        QString fileName = savePath + "/" + currentTime.toString("yyyy.MM.dd_hh.mm.ss") + ".png";
        // 将截图保存为 PNG 格式的图片
        screenshot.save(fileName, "PNG");
        // 在调试输出中显示保存成功的信息
        qDebug() << "截图保存成功：" << fileName;
    }
    else
    {
        // 如果用户未选择保存路径，在调试输出中显示未保存的信息
        qDebug() << "未选择保存路径，截图未保存。";
    }
}



